#ifndef GLOBAL_H
#define GLOBAL_H

#include <stdarg.h>
#include <sys/stat.h>  // 目录操作
#include <sys/time.h>  // for gettimeofday

#include <atomic>
#include <chrono>
#include <ctime>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <map>
#include <mutex>
#include <queue>
#include <sstream>
#include <string>
#include <thread>
#include <vector>

#define UDP_SERVER_IP "192.168.1.10"
#define UDP_SERVER_PORT 50888

#define TCP_SERVER_PORT 50889

#define FANZHI_TIANXIAN_POINT_NUM 232  // 反制天线预置位

#define RECOGINZE_ID 10 // 跟踪相机当侦测用时的id
#define RECOGINZE_SCORE_THRESHOLD 0.45 // 识别阈值
#define RECOGINZE_SCORE_THRESHOLD_TRASE2 0.25 // 识别阈值2
#define RECOGINZE_COUNT 5 // 识别次数

#define TRACK_PHASE1_TIMEOUT_SECOND 300 // 第一阶段跟踪时长
#define ZOOM_INTERVAL_SECONDS 5 // 两次变倍最小间隔秒数
#define RECOGINZE_ID 10                 // 跟踪相机当侦测用时的id
#define RECOGINZE_SCORE_THRESHOLD 0.45  // 识别阈值
#define RECOGINZE_COUNT 5               // 识别次数

#define TRACK_PHASE1_TIMEOUT_SECOND 300  // 第一阶段跟踪时长
#define ZOOM_INTERVAL_SECONDS 5          // 两次变倍最小间隔秒数

#define INTERSECTION 0.3   // 目标框与不识别区域的交集阈值

extern bool isDetectionAreaDisabled; // 是否开启不侦测区域
#define SPY_SCORE_THRESHOLD 0.25  // 侦测阈值
#define SPY_COUNT 2               // 侦测次数
#define MAX_TRACK_COUNT 5         // 跟踪次数阈值

typedef struct bbox_t
{
    int class_id = 0;
    double score = 0;
    int x = 0;
    int y = 0;
    int w = 0;
    int h = 0;
    double cy = 0;  // 目标中心点相对坐标[0-1]
    double cx = 0;
} bbox_t;

struct SpyConfig
{                       // 侦测配置
    int id = 0;         // 侦测相机ip
    int threshold = 0;  // 侦测阈值
    double pan = 0;     // ptz位置
    double tilt = 0;
    int zoom = 0;
};

struct SpyMessage
{  // 侦测消息
    int spy_id = 0;
    bbox_t bbox;
};

// 软件版本号
extern std::string APP_VERSION;
// 模型版本号
extern std::string MODEL_VERSION;
// 云台版本号
extern std::string GIMBAL_VERSION;

// 是否使用 12mm 镜头的标志
extern bool USE_12MM_LENS_FLAG;

// 保存配置信息
extern char save_conf[8][30];

// 反制类型
extern std::atomic<uint8_t> counter_action;

void custom_printf(const char *format, ...);
std::string generate_timestamp_id(int id);
std::map<int, SpyConfig> load_spy_config(const std::string &filename);
bool save_spy_config(const std::string &filename, const std::map<int, SpyConfig> &spy_map);


#endif // GLOBAL_H